#define _GNU_SOURCE
#include "daemon_runner.h"
#include "daemon_sub_process.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>

static char *cmd_params[SUB_PROCESS_COUNT] = {"app", "ota"};
static SubProcess *sub_processes[SUB_PROCESS_COUNT];

static int is_running = 1;
void exit_fun (int signo) {
    is_running = 0;
}

int daemon_runner_run(void)
{

    // 将当前进程设置为守护进程
    // 参数1：0表示将进程的运行目录设置为根目录(/), 1表i示运行目录为当前目录
    // 参数2：0表示自动关闭标准输入和标准输出, 1表示不自动关闭
    daemon(0, 1);

    // 标准输入输出的重定向
    close(STDIN_FILENO); // 0
    close(STDOUT_FILENO); // 1
    close(STDERR_FILENO); // 2
    open("/dev/null", O_RDONLY); // 0
    open(LOG_FILE, O_CREAT|O_WRONLY|O_APPEND, 0644); // 1   标准输出
    open(LOG_FILE, O_CREAT|O_WRONLY|O_APPEND, 0644);  // 2  标准错误输出

    // 注册结束信号
    signal(SIGTERM, exit_fun);

    // 初始化所有的子进程
    for (int i = 0; i < SUB_PROCESS_COUNT; i++) {
        sub_processes[i] = daemon_sub_process_init(cmd_params[i]);
    }

    // 不断的对所有子进程进行检查启动 （间隔1s）
    while (is_running) {
        for (int i = 0; i < SUB_PROCESS_COUNT; i++)
        {
            daemon_sub_process_checkStart(sub_processes[i]);
        }
        sleep(1);
    }


    // 在守护进程结束前，结束所有的子进程
    for (int i = 0; i < SUB_PROCESS_COUNT; i++) {
        daemon_sub_process_stop(sub_processes[i]);
    }
    
    return 0;
}